(function () {
	// example
	class Cat {
		//我们为 Cat 类新增一个独特的方法，这个时候的表现才是符合预期的，即我们只能用真实的 Cat 类来进行调用：则会报错
		// meow() {}
		eat() {
			console.log(1);
		}
	}
	class Dog {
		eat() {}
	}

	function feedCat(cat: Cat) {}

	// 实现一只短毛猫！
	class ShorthairCat extends Cat {
		eat() {
			super.eat();
			console.log(2);
			return new ShorthairCat();
		}
	}
	feedCat(new Dog());
	//这里的 feedCat 函数明明需要的是一只猫，可为什么上传一只狗也可以呢？实际上，这就是 TypeScript 的类型系统特性：结构化类型系统
	feedCat(new Cat());

	feedCat(new ShorthairCat().eat());

	class Cat1 {
		eat(): boolean {
			return true;
		}
	}

	class Dog1 {
		eat(): number {
			return 599;
		}
	}
	function feedCat1(cat: Cat1) {}

	//在比较对象类型的属性时，同样会采用结构化类型系统进行判断。而对结构中的函数类型（即方法）进行比较时，同样存在类型的兼容性比较：
	// feedCat1(new Dog1()); // 报错！
})();
